package kded.demo.schedule;

import kd.bos.dataentity.serialization.SerializationUtils;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.form.FormShowParameter;
import kd.bos.form.FormShowParameterNames;
import kd.bos.form.IFormView;
import kd.bos.form.ShowType;
import kd.bos.schedule.api.TaskInfo;
import kd.bos.schedule.form.AbstractTaskClick;
import kd.bos.schedule.form.TaskProgressFormEdit;
import kd.bos.schedule.form.event.ClickEventArgs;
import kd.bos.schedule.form.event.ItemClickEventArgs;

/*
 * @author rd_johnnyding
 *
 */
public class MyTaskClick extends AbstractTaskClick {
    /**
     * 用户点击了前端任务提醒面板上的任务
     */
    @Override
    public void click(ClickEventArgs e) {
// 获取任务执行结果
        TaskInfo taskInfo = this.queryTask();
// 获取首页（不会为null）
//IFormView mainView = this.getMainView();
// 获取发起任务的页面（如果用户已经关闭了发起任务的页面，返回null）
        IFormView parentView = this.getParentView();
        if (taskInfo.isTaskEnd()) {
// 任务已经结束
            e.setClearTask(true); // 通知平台，清除前端任务提醒图标
            this.getMainView().showMessage("任务已经结束，可以在此处打开结果查看界面");
        } else {
// 任务没有结束，重新打开进度界面
            if (parentView == null) {
                this.getMainView().showMessage("启动任务的页面已经关闭，不能再打开进度界面");
            } else {
                this.showProgressForm(parentView);
            }
        }
    }

    /**
     * 用户点击了前端任务面板上的某个小按钮
     */
    @Override
    public void itemClick(ItemClickEventArgs e) {
    }

    /**
     * 用户点击了前端任务面板上的清除按钮，清除已完成的任务条目
     *
     * @return 默认返回true，同意前端清除此任务；如果认为时机不合适，还不希望任务条目被清除，可以返回false
     */
    @Override
    public boolean release() {
// TODO 释放资源、缓存等
        return true;
    }

    /**
     * 重新打开任务进度界面
     *
     * @param view
     */
    private void showProgressForm(IFormView view) {
        if (this.isExistProgressForm()) {
// 已经打开了进度界面，无需再次打开
            return;
        }
        FormShowParameter showParameter = new FormShowParameter();
        showParameter.setFormId(TaskProgressFormEdit.FORMID_TASKPROGRESS); // 指定进度页面标识：
        //本示例打开标准任务进度页面
        showParameter.getOpenStyle().setShowType(ShowType.Modal);
// 进度界面标题：显示当前任务名称
        if (StringUtils.isBlank(this.getJobFormInfo().getCaption())) {
            showParameter.setCaption(this.getJobFormInfo().getCaption());
        }
// 设置进度页面的微服务节点：与任务保持一致
        showParameter.getCustomParams().put(FormShowParameterNames.SERVICEAPPID,
                this.getJobFormInfo().getJobInfo().getAppId());
// 自定义参数：把任务目标，打包传入进度界面
        String jobInfoStr = SerializationUtils.toJsonString(this.getJobFormInfo());
        showParameter.getCustomParams().put(TaskProgressFormEdit.CUSTPARAM_CLIENTJOBINFO,
                jobInfoStr);
// 把任务标识，传入进度界面：不传会重新发布一个新任务
        showParameter.getCustomParams().put(TaskProgressFormEdit.CUSTPARAM_TASKID,
                this.getTaskId());
        // 回调参数
        showParameter.setCloseCallBack(this.getJobFormInfo().getCloseCallBack());
// 显示界面
        view.showForm(showParameter);
// 把指令发回前端：如下代码必须，否则界面会显示不出来
        this.getMainView().sendFormAction(view);
// 把新打开的进度页面pageid，记录到缓存
        this.setProgressPageId(showParameter.getPageId());
    }
}
